Флаги не меняются.
Команда:
REP КОС (команда обработки строк)
Логика:
while CX <> 0 ; для КОС MOVS, LODS или STOS выполнить КОС CX = CX - 1 ___________________________________________________ while CX <> 0 ; для КОС CMPS или SCAS CX = CX - 1 if ZF = 0 то заканчиваем цикл
REP - это префикс, который может быть употреблен перед любой КОС (CMPS, LODS, MOVS, SCAS и STOS). Префикс REP заставляет выполняться следующую за ним КОС в повторном режиме до тех пор, пока CX не станет равным 0; CX уменьшается на 1 после каждого выполнения КОС. (Для КОС CMPS и SCAS циклический повтор прерывается также, если признак нулевого результата ZF оказывается сброшенным после очередного выполнения КОС.)
Операнды | Такт байты (слова) | Обращения | Байты | Пример |
нет операндов | 2 | - | 1 | REP MOVS TO,FROM |
Примечания:
Если CX с самого начала равно 0, то КОС не выполняется ни разу. Проверка о равенстве CX нулю проводится перед выполнением КОС. Проверка о равенстве ZF нулю проводится только для команд CMPS и SCAS, причем лишь после очередного выполнения КОС.
Префиксы REP, REPE (повтор пока равно) и REPZ (повтор пока ноль) - все являются синонимами одного и того же префикса.
Префикс REPNZ (повтор пока не ноль) похож на REP и отличается лишь тем, что для команд CMPS и SCAS повтор прекращается, когда ZF установлен, а не когда сброшен (как в REP).
Префикс REP используется обычно с КОС MOVS (пересылка строки) и STOS (запись строки), его можно интерпретировать как "повторяй, пока не кончится строка".
У Вас нет необходимости инициализировать ZF перед использованием повторяющихся КОС.
Повторяющаяся КОС, которая была прервана между повторами, будет корректно возобновлена после возврата из прерывания. Однако, если перед КОС находятся также другие префиксы (например, LOCK) в добавление к REP, то все префиксы, кроме того, который непосредственно предшествует команде, будут потеряны. Поэтому, если Вам нужно использовать команду с несколькими префиксами одновременно, то Вам следует запретить прерывания на время выполнения команды (и снова разрешить из после ее выполнения). Обратите Ваше внимание на то, что даже такая мера предосторожности не предохраняет от немаскированных прерываний и что обработка длинных строк может существенно задерживать обработку прерываний.
Следующий пример иллюстрирует пересылку 100 байтов из BUFFER1 в BUFFER2 :
CLD ;двигаться будем в прямом направлении LEA SI, BUFFER1 ;засылаем в SI и DI стартовые адреса LEA DI, BUFFER2 ;строк (исходной и назначения) MOV CX, 100 ;префикс REP использует CX как счетчик REP MOVSB ;осуществляем пересылку